var createError = require('http-errors');
var express = require('express');
// 因为vue和后端不是同源策略 同域名 同端口 同协议才不存在跨域问题
var cors = require('cors')

var path = require('path');
var logger = require('morgan');
// 要使用session先下一个官方的session包
var session = require('express-session')
var indexRouter = require('./routes/index');
var proRouter = require('./routes/pro');
var userRouter = require('./routes/user');
var loginRouter = require('./routes/login');
var registerRouter = require('./routes/register');
var registerpassword = require('./routes/registerpassword');
var httpvueRouter = require('./routes/httpvue');
// cookie的解析器
var cookieParser = require('cookie-parser')
var app = express();
// 
app.use(cors())
// view engine setup
var backRouter = require('./routes/back');
app.set('views', path.join(__dirname, 'views'));
console.log(path.join(__dirname))
//使用模板 引擎ejs
app.set('view engine', 'ejs');
// dev的时候会处理logger日志
app.use(logger('dev'));




// 以下是cookie的路由守卫 
// 使用cookie的解析器 
// app.use(cookieParser())
// // cookie版本的路由守卫 类似于迪士尼门口的保安
// // 不登陆不让进
// // 第一个参数* 是全部的意思 all也对应全部的请求的意思 
// // 第二个参数是一个回调函数
// app.all('*',(req,res,next)=>{
//   console.log('进来了cookie版本的路由守卫')
//   console.log('req.cookies',req.cookies)
//   console.log('req.url',req.url)
//   // 路由守卫规则设置  保安规则设置
//   if(req.cookies.islogin == 'ok' || req.url=='/login' || req.url=='/login/in' ) {
//     next()
//   } else {
//      console.log('进入cookie路由守卫的else里面了 没有权限进入login')
//      res.redirect('/login')
//   }
// })

// 以下是session的路由守卫  以及配置
// session引擎的位置  session引擎 把他进行分裂  一个d 一个大狗  d实际上就是cookie 给前面浏览器
// 通过d 来找到 大狗   咱们这里是 一段乱码 来找 islogin = ok 
// app.use(session({
//   // 这个功能一会儿说 
//   secret: 'fefefeffefef',
//   // 官方要求默认 是禁止强制缓存默认官方复制过来就是false
//   resave: false,
//   // 初始化为true 
//   saveUninitialized: true,
//   // 两小时   
//   // 这里还要戴一个疑问 不是session嘛？为什么有cookie的配置  maxAge:1000*60*120session时间两小时
//   // session 会分裂一次 有百分之50给浏览器的就是cookie   另外的真相存在服务端
//   cookie: { maxAge:1000*60*120 }
// }))


// app.all('*',(req,res,next)=> {
//   console.log('sesssion路由守卫')
//   // req.session.islogin 这一步 人家会自动的  sessions.XuXylilC9I4O2I 
// //   var sessions = {
// //     s%3ArL6yyGHytaKA_RcrnX:{
// //          islogin:ok
// //     }
// // }

//   if(req.session.islogin == 'ok' || req.url == '/login' || req.url == '/login/in' || req.url == '/register' || req.url == '/register/in') {
//     console.log('sesssion路由守卫进来允许通过的里面了')
//     next()
//   }else {
//       console.log('sesssion路由守卫进来非允许通过的里面了')
//       res.redirect('/login')
//   }
// })











// 使用express的json模块 可以接收和处理现在最常用方便的JSON数据 脚手架已经配好
app.use(express.json());
//xtended: false：表示使用系统模块querystring来处理，也是官方推荐的  
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
//以下是路由表的use  必须先命中第一个路由表  才能进入后面的indexRouter 等 注意！
app.use('/', indexRouter);
// app.use('/users', usersRouter);
app.use('/pro', proRouter);
// 退出的路由
app.use('/back',backRouter)
app.use('/user', userRouter);
app.use('/login', loginRouter);
app.use('/register', registerRouter);
// 路由表  可以决定是否使用 
app.use('/addregisterpassword', registerpassword);
// vue前后端联调 
app.use('/httpvue', httpvueRouter);
// catch 404 and forward to error handler registerpassword
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  
  res.render('error');
});

module.exports = app;
